package CreationPattern.FactoryMethod;

/**
 * @Classname : MobilePhoneFactory
 * @Description : 创建型-工厂方法
 * 一、模式定义
 *   Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
 *   （定义一个接口用于创建对象，但是让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到子类。）
 *   理解：
 *   优点：降低高层模块与底层模块之间的耦合
 *   缺点：增加代码的复杂度
 * 二、模式类图
 *   https://kdocs.cn/l/cnqHkqvUoEDj
 * 三、适用场景
 *   1、需要灵活可扩展的框架时，通过不同工厂可以获取不同的产品，产品有公共方法（来自接口或抽象类） 且 同一产品的公共方法表现固定
 * 四、应用举例
 *   1、数据不同格式文件导出
 *
 * @Author : chentianyu
 * @Date 2022/12/31 00:07
 */


/**
 * 手机工厂抽象类
 */
public abstract class PhoneFactory {

    public void run() {
        PhoneProduct phoneProduct = createMobilePhone();
        phoneProduct.run();
    }

    public abstract PhoneProduct createMobilePhone();  // 生产手机

}


/**
 * 华为手机工厂
 */
class HUAWEIFactory extends PhoneFactory {
    @Override
    public PhoneProduct createMobilePhone() {
        return new HUAWEI();  // 生产华为手机
    }
}


/**
 * 小米手机工厂
 */
class XIAOMIFactory extends PhoneFactory {

    @Override
    public PhoneProduct createMobilePhone() {
        return new XIAOMI();  // 生产小米手机
    }

}
